package util

// SliceStack 栈结构
type SliceStack[T any] struct {
	data []T
}

func NewSliceStack[T any]() *SliceStack[T] {
	return &SliceStack[T]{
		data: make([]T, 0),
	}
}

func (s *SliceStack[T]) Push(v T) {
	s.data = append(s.data, v)
}

func (s *SliceStack[T]) Pop() (T, bool) {
	if s.IsEmpty() {
		var zero T
		return zero, false
	}
	index := len(s.data) - 1
	v := s.data[index]
	s.data = s.data[:index]
	return v, true
}

func (s *SliceStack[T]) IsEmpty() bool {
	return len(s.data) == 0
}

func (s *SliceStack[T]) Peek() (T, bool) {
	if s.IsEmpty() {
		var zero T
		return zero, false
	}
	index := len(s.data) - 1
	return s.data[index], true
}

func (s *SliceStack[T]) Len() int {
	return len(s.data)
}

func (s *SliceStack[T]) Clear() {
	s.data = make([]T, 0)
}
